package org.wupuser.service.impl;

import jakarta.annotation.Resource;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;
import org.wupuser.model.Friend;
import org.wupuser.model.User;
import org.wupuser.model.dto.FriendQueryRequest;
import org.wupuser.model.dto.FriendRequest;
import org.wupuser.repository.FriendRepository;
import org.wupuser.service.FriendService;

import java.time.Instant;
import java.util.List;

@Service
public class FriendServiceImpl implements FriendService {
	@Resource
	private FriendRepository friendRepository;
	
	/**
	 * 根据用户ID查询该用户的所有好友信息
	 *
	 * @param userId 用户ID，用于查询指定用户的好友列表
	 *
	 * @return FriendQueryRequest 包含好友列表或错误信息的响应对象
	 */
	@Override
	public FriendQueryRequest findUsersAllFriendById(Long userId) {
		// 创建好友查询请求对象
		FriendQueryRequest friendQueryRequest = new FriendQueryRequest();
		// 声明好友列表变量
		List<User> friends;
		try {
			// 尝试从数据库中查询用户的所有好友
			friends = friendRepository.findUsersAllFriendById(userId);
			// 将查询到的好友列表设置到响应对象中
			if (friends != null) {// 好友不为空
				friendQueryRequest.setObject(friends);
			}
			// 设置查询成功的消息
			friendQueryRequest.setMessage("查询成功");
		}
		catch (JpaSystemException e) {
			// 捕获JPA系统异常，设置错误消息
			friendQueryRequest.setMessage("系统出错，未查询到好友");
			// 返回包含错误信息的响应对象
			return friendQueryRequest;
		}
		// 返回包含好友列表的响应对象
		return friendQueryRequest;
	}
	
	/**
	 * 根据好友ID查询好友请求
	 *
	 * @param friendId 好友ID，用于查询特定好友的请求信息
	 *
	 * @return FriendQueryRequest 包含查询结果和状态信息的请求对象
	 */
	@Override
	public FriendQueryRequest findRequest(Long friendId) {
		// 创建一个好友查询请求对象
		FriendQueryRequest friendQueryRequest = new FriendQueryRequest();
		// 声明一个好友列表，用于存储查询结果
		List<Friend> friends;
		try {
			// 尝试从数据库中查询好友请求
			friends = friendRepository.findRequest(friendId);
			// 如果查询结果不为空，则设置到请求对象中
			if (friends != null) {
				friendQueryRequest.setObject(friends);
			}
			// 设置查询成功状态信息
			friendQueryRequest.setMessage("查询成功");
		}
		// 捕获数据库异常
		catch (JpaSystemException e) {
			// 设置系统错误状态信息
			friendQueryRequest.setMessage("系统出错，未查询到添加好友请求");
			return friendQueryRequest;
		}
		// 返回包含查询结果的请求对象
		return friendQueryRequest;
	}
	
	/**
	 * 发送好友请求的方法
	 *
	 * @param friendRequest 包含好友请求信息的对象，包含用户ID和好友ID
	 *
	 * @return 返回请求发送状态的结果字符串
	 */
	@Override
	public String sendRequestToSomeOne(FriendRequest friendRequest) {
		// 创建一个新的Friend对象
		Friend friend = new Friend();
		// 设置好友ID
		friend.setFriendId(friendRequest.getFriendId());
		// 设置用户ID
		friend.setUserId(friendRequest.getUserId());
		// 设置好友关系状态为false（未确认）
		friend.setStatus(false);
		// 设置创建时间为当前时间
		friend.setCreateTime(Instant.now());
		// 设置确认时间为null（初始状态为未确认）
		friend.setConfirmTime(null);
		
		try {
			// 尝试发送请求或确认双向好友关系
			friendRepository.sendRequestOrConfirmTowWay(friend);
		}
		catch (JpaSystemException e) {
			// 如果发生JPA系统异常，返回错误信息
			return "系统错误，请求未发送";
		}
		// 如果操作成功，返回成功信息
		return "请求已发送";
	}
	
	/**
	 * 确认双向好友关系的方法
	 *
	 * @param leftId  第一个用户的ID
	 * @param rightId 第二个用户的ID
	 *
	 * @return 返回操作结果信息
	 */
	@Override
	public String confirmTwoWayFriend(
		Long leftId,
		// 第一个用户的ID(被请求方)
		Long rightId) { // 第二个用户的ID
		// 创建一个新的Friend对象
		Friend friend = new Friend();
		try {
			// 设置第一个用户为发起方，第二个用户为接收方
			friend.setUserId(leftId);
			friend.setFriendId(rightId);
			friend.setConfirmTime(Instant.now());   // 设置确认时间为当前时间
			friendRepository.confirmRequestFromFriend(friend);
			// 设置第二个用户为发起方，第一个用户为接收方，并设置好友关系状态为已确认
			friend.setUserId(rightId);
			friend.setFriendId(leftId);
			friend.setStatus(true);
			friend.setCreateTime(Instant.now());    // 设置创建时间
			friend.setConfirmTime(Instant.now());   // 设置确认时间
			friendRepository.sendRequestOrConfirmTowWay(friend);
		}
		catch (JpaSystemException e) {
			// 捕获数据库异常并返回错误信息
			return "系统错误，确认失败";
		}
		// 操作成功返回确认成功信息
		return "确认成功";
	}
	
	/**
	 * 删除好友关系的方法 该方法会双向删除两个用户之间的好友关系
	 *
	 * @param leftId  第一个用户的ID
	 * @param rightId 第二个用户的ID
	 *
	 * @return 返回操作结果信息，成功返回"删除成功"，失败返回"系统错误，删除失败"
	 */
	@Override
	public String deleteFriend(
		Long leftId,
		// 第一个用户的ID
		Long rightId) {  // 第二个用户的ID
		try {
			// 删除leftId对rightId的好友关系
			friendRepository.deleteFriend(
				leftId,
				rightId);
			// 删除rightId对leftId的好友关系（双向删除）
			friendRepository.deleteFriend(
				rightId,
				leftId);
		}
		catch (JpaSystemException e) {  // 捕获JPA系统异常
			return "系统错误，删除失败";  // 返回错误信息
		}
		return "删除成功";  // 返回成功信息
	}
}
